
/**
 * 返回一个 actionCreator 函数
 * @param {*} type 接收一个 action 动作对象 的 type 字符串作为参数
 * @param {*} prepareAction 预处理参数的函数 返回一个处理后的参数对象
 * @returns actionCreator 函数 
 */
function createAction(type, prepareAction){
  /**
   * 基于参数对象 返回一个 action 动作对象
   * @param {*} payload 参数对象
   * @returns 将参数处理后的 action 动作对象
   */
  function actionCreator(payload) {
    if (prepareAction) { // 判断是否需要动态生成 payload
      const preparedAction = prepareAction.call(null, payload)
      return {
        type,
        ...preparedAction
      }
    }
    return {
      type,
      payload
    }
  }

  actionCreator.toString = () => type // 重写 toString 方法

  actionCreator.type = type // 给函数扩展一个 type 属性 其中值是动作类型
  return actionCreator
}

export default createAction
